# 字符串类型

# 定义
s1 = 'hello'
print(type(s1))  # <class 'str'>
print(s1)  # hello

# 类型转换
# 将任意类型转化为字符串
s2 = str({'a': 1})
print(type(s2))  # <class 'str'>
print(s2)  # {'a': 1}   注意:已经是字符串格式

# 常用方法
# 按索引取值 （只能取值，不能通过索引修改值，字符串是个整体，是不可变类型）
s3 = 'hello'
# 正向取值 从0开始 到4结束 即长度-1结束
print(s3[0])  # h
# 反向取值 从-1开始 到-5结束,即-长度结束
print(s3[-1])  # o
print(s3[-5])  # h

# 索引切片 从原字符串中拷贝一个子字符串
s4 = 'hello world'
# 取头不取尾
print(s4[0:6])  # hello
# 按步长切片
# 索引从0开始取值，每次增加步长2取值，直到等于或者大于结束索引3为止
print(s4[0:3:2])  # hl
# 反向步长
print(s4[4:0:-1])  # olle
# 字符串取反
print(s4[::-1])  # dlrow olleh

# 循环遍历
for i in s4:
    print(i, end=' ')  # print默认换行，使用end指定末尾为空格而不换行
    # 打印 h e l l o   w o r l d

# strip 移除字符串两侧的字符，默认移除空格，返回新字符串
s5 = '  a bc '
print(s5.strip())  # a bc
s6 = '**a*bc*'
print(s6.strip('*'))  # a*bc
# lstrip 只去除左边字符
print(s6.lstrip('*'))  # a*bc*
# rstrip 只去除右边字符
print(s6.rstrip('*'))  # **a*bc

# split 将字符串按固定字符和次数切分,默认按空格切分，默认切分次数无限，返回列表
s7 = 'aa bb cc|dd|ee'
print(s7.split())  # ['aa', 'bb', 'cc|dd|ee']
print(s7.split('|'))  # ['aa bb cc', 'dd', 'ee']
# rsplit 从右往左切分字符串
print(s7.split('|', 1))  # ['aa bb cc', 'dd|ee']
print(s7.rsplit('|', 1))  # ['aa bb cc|dd', 'ee']

# lower 字母转换为小写 upper 字母转换为大写 均返回新字符串
s8 = 'abcDEF'
print(s8.lower())  # abcdef
print(s8.upper())  # ABCDEF

# startswith 是否以某字符串开头
# endswith 是否以某字符串结尾 返回布尔值
s9 = 'roy is a man'
print(s9.startswith('roy'))  # True
print(s9.endswith('a'))  # False

# join 将列表按指定字符串拼接
l = ['a', 'b', 'c']
s10 = ':'.join(l)
print(s10)  # a:b:c

# replace 替换字符串中的子串，默认全部替换，可以选择替换个数，返回新字符串
s11 = 'aabbccaa'
# 全部替换
print(s11.replace('a', 'A'))  # AAbbccAA
# 替换一个
print(s11.replace('a', 'A', 1))  # Aabbccaa

# isdigit 判断字符串是否由纯数字组成 返回布尔值
print('123'.isdigit())  # Trie

# find 返回要查找的字符串再大字符串中的起始索引 找不到返回-1 推荐使用
print('abc'.find('k'))  # -1
# index 与find类似 返回要查找的字符串再大字符串中的起始索引 找不到抛出异常
print('abc'.index('c'))  # 2

# count 统计字符串出现的次数
print('aabccc'.count('c'))  # 3

# center 指定宽度，字符串居中，其他用传入的字符串填充
print('hello'.center(11, '*'))  # ***hello***
# ljust 指定宽度，字符串居左，其他用传入的字符串填充
print('hello'.ljust(10, '*'))  # hello*****
# rjust 指定宽度，字符串居右，其他用传入的字符串填充
print('hello'.rjust(10, '*'))  # *****hello
# zfill 指定宽度，字符串左边使用0填充
print('hello'.zfill(10))  # 00000hello

# expandtabs 设置制表符代表的空格数
print('hello\tworld'.expandtabs(10))  # hello     world

# captalize 首字母大写
print('hello'.capitalize())  # Hello
# swapcase 大小写反转
print('HEllo'.swapcase())  # heLLO
# title 每个单词首字母大写
print('hello hi nihao'.title())  # Hello Hi Nihao

# islower 是否为全小写
print('abc'.islower())  # True
# isupper 是否为全大写
print('ABC'.isupper())  # True
# istitle 是否单词首字母大写
print('Hello Hi'.istitle())  # True
# isalnum 是否未字母和数字混合的字符串
print('123Ab'.isalnum())  # True
# isalpha 是否只是字母
print('ABc'.isalpha())  # True
# isspace 是否只是空格
print('   '.isspace())  # True
# isidentifier 是否为合法变量名
print('def'.isidentifier())  # True
print('1age_of_student'.isidentifier())  # False
print('age_of_student'.isidentifier())  # True

# 数字判断
str_num1 = b'4'  # byte
str_num2 = u'4'  # unicode python3中需要加u，默认unicode
str_num3 = '四'  # 中文四
str_num4 = 'Ⅳ'  # 罗马数字

# isdigit
print(str_num1.isdigit())  # True
print(str_num2.isdigit())  # True
print(str_num3.isdigit())  # False
print(str_num4.isdigit())  # False

# isdigit
print(str_num2.isnumeric())  # True
print(str_num3.isnumeric())  # True
print(str_num4.isnumeric())  # True

# isdecimal
print(str_num2.isdecimal())  # True
print(str_num3.isdecimal())  # False
print(str_num4.isdecimal())  # False
